package com.xuexi.leetcode;

/**
 * @Author: 梁二东
 * @Date: 2024/11/16 15:18
 * @Description: 空格：读入字符串并丢弃无用的前导空格（" "）
 * 符号：检查下一个字符（假设还未到字符末尾）为 '-' 还是 '+'。如果两者都不存在，则假定结果为正。
 * 转换：通过跳过前置零来读取该整数，直到遇到非数字字符或到达字符串的结尾。如果没有读取数字，则结果为0。
 * 舍入：如果整数数超过 32 位有符号整数范围 [−231,  231 − 1] ，需要截断这个整数，使其保持在这个范围内。具体来说，小于 −231 的整数应该被舍入为 −231 ，大于 231 − 1 的整数应该被舍入为 231 − 1 。
 **/
public class LeetCodemyAtoi {

    public static void main(String[] args) {
        System.out.println(myAtoi("-91283472332"));
        System.out.println(myAtoi("21474836460"));
        System.out.println(myAtoi("2147483648"));
        System.out.println(myAtoi("-2147483649"));
        System.out.println(myAtoi("-2147483647"));
    }

    public static int myAtoi(String s) {
        int start = 0;
        long result = 0;
        int flag = 1;
        for (char c : s.trim().toCharArray()) {
            //1、第一步判断符号
            if (start == 0) {
                start++;
                flag = '+' == c ? 1 : '-' == c ? -1 : (c >= 48 && c <= 57) ? 1 : 0;
                if (flag == 0) {
                    return 0;
                }
                //2、第一位可能是数字
                if (c >= 48 && c <= 57) {
                    result = Long.parseLong(String.valueOf(c));
                }
                continue;
            }
            // 0 <= c >= 9
            if (c >= 48 && c <= 57) {
                // 去符号运算
                result = result * 10 + Long.parseLong(String.valueOf(c));
                // 带符号比较
                result *= flag;
                if (result >= Integer.MAX_VALUE) {
                    return Integer.MAX_VALUE;
                } else if (result <= Integer.MIN_VALUE) {
                    return Integer.MIN_VALUE;
                }
                // 去掉符号进行下次循环时计算
                result *= flag;
            } else {
                // 不是数字跳出循环
                break;
            }
        }
        return (int) result * flag;
    }
}
